<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<meta name="theme-color" content="#222"><meta name="generator" content="Hexo 7.3.0">

  <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png">
  <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32.ico">
  <link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16.ico">
  <link rel="mask-icon" href="/images/logo.svg" color="#222">

<link rel="stylesheet" href="/css/main.css">



<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" integrity="sha256-wiz7ZSCn/btzhjKDQBms9Hx4sSeUYsDrTLg7roPstac=" crossorigin="anonymous">
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.1.1/animate.min.css" integrity="sha256-PR7ttpcvz8qrF57fur/yAx1qXMFJeJFiA6pSzWi0OIE=" crossorigin="anonymous">
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/fancyapps-ui/5.0.28/fancybox/fancybox.css" integrity="sha256-6cQIC71/iBIYXFK+0RHAvwmjwWzkWd+r7v/BX3/vZDc=" crossorigin="anonymous">
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/pace/1.2.4/themes/green/pace-theme-minimal.css">
  <script src="https://cdnjs.cloudflare.com/ajax/libs/pace/1.2.4/pace.min.js" integrity="sha256-gqd7YTjg/BtfqWSwsJOvndl0Bxc8gFImLEkXQT8+qj0=" crossorigin="anonymous"></script>

<script class="next-config" data-name="main" type="application/json">{"hostname":"sumumm.github.io","root":"/","images":"/images","scheme":"Gemini","darkmode":false,"version":"8.19.2","exturl":false,"sidebar":{"position":"left","display":"post","padding":18,"offset":12},"copycode":{"enable":true,"style":"mac"},"fold":{"enable":true,"height":300},"bookmark":{"enable":false,"color":"#222","save":"auto"},"mediumzoom":false,"lazyload":true,"pangu":false,"comments":{"style":"tabs","active":null,"storage":true,"lazyload":false,"nav":null},"stickytabs":false,"motion":{"enable":true,"async":true,"transition":{"menu_item":"fadeInDown","post_block":"fadeIn","post_header":"fadeInDown","post_body":"fadeInDown","coll_header":"fadeInLeft","sidebar":"fadeInUp"}},"i18n":{"placeholder":"搜索...","empty":"没有找到任何搜索结果：${query}","hits_time":"找到 ${hits} 个搜索结果（用时 ${time} 毫秒）","hits":"找到 ${hits} 个搜索结果"},"path":"/search.xml","localsearch":{"enable":true,"trigger":"auto","top_n_per_article":1,"unescape":false,"preload":false}}</script><script src="/js/config.js"></script>

    <meta name="description" content="本文主要是C语言版的LED点亮实验的相关笔记，若笔记中有错误或者不合适的地方，欢迎批评指正😃。">
<meta property="og:type" content="article">
<meta property="og:title" content="LV04-02-GPIO-04-C语言下的GPIO操作">
<meta property="og:url" content="https://sumumm.github.io/post/87e9a534.html">
<meta property="og:site_name" content="苏木">
<meta property="og:description" content="本文主要是C语言版的LED点亮实验的相关笔记，若笔记中有错误或者不合适的地方，欢迎批评指正😃。">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/02IMX6ULL%E5%B9%B3%E5%8F%B0/LV04-%E8%A3%B8%E6%9C%BA%E5%BC%80%E5%8F%91/LV04-02-GPIO-04-C%E8%AF%AD%E8%A8%80%E4%B8%8B%E7%9A%84GPIO%E6%93%8D%E4%BD%9C/img/image-20230716162559972.png">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/02IMX6ULL%E5%B9%B3%E5%8F%B0/LV04-%E8%A3%B8%E6%9C%BA%E5%BC%80%E5%8F%91/LV04-02-GPIO-04-C%E8%AF%AD%E8%A8%80%E4%B8%8B%E7%9A%84GPIO%E6%93%8D%E4%BD%9C/img/image-20230719195210025.png">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/02IMX6ULL%E5%B9%B3%E5%8F%B0/LV04-%E8%A3%B8%E6%9C%BA%E5%BC%80%E5%8F%91/LV04-02-GPIO-04-C%E8%AF%AD%E8%A8%80%E4%B8%8B%E7%9A%84GPIO%E6%93%8D%E4%BD%9C/img/image-20230719195813566.png">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/02IMX6ULL%E5%B9%B3%E5%8F%B0/LV04-%E8%A3%B8%E6%9C%BA%E5%BC%80%E5%8F%91/LV04-02-GPIO-04-C%E8%AF%AD%E8%A8%80%E4%B8%8B%E7%9A%84GPIO%E6%93%8D%E4%BD%9C/img/image-20230719200601757.png">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/02IMX6ULL%E5%B9%B3%E5%8F%B0/LV04-%E8%A3%B8%E6%9C%BA%E5%BC%80%E5%8F%91/LV04-02-GPIO-04-C%E8%AF%AD%E8%A8%80%E4%B8%8B%E7%9A%84GPIO%E6%93%8D%E4%BD%9C/img/image-20230719201027343.png">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/02IMX6ULL%E5%B9%B3%E5%8F%B0/LV04-%E8%A3%B8%E6%9C%BA%E5%BC%80%E5%8F%91/LV04-02-GPIO-04-C%E8%AF%AD%E8%A8%80%E4%B8%8B%E7%9A%84GPIO%E6%93%8D%E4%BD%9C/img/image-20230719201349250.png">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/02IMX6ULL%E5%B9%B3%E5%8F%B0/LV04-%E8%A3%B8%E6%9C%BA%E5%BC%80%E5%8F%91/LV04-02-GPIO-04-C%E8%AF%AD%E8%A8%80%E4%B8%8B%E7%9A%84GPIO%E6%93%8D%E4%BD%9C/img/image-20230719201427614.png">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/02IMX6ULL%E5%B9%B3%E5%8F%B0/LV04-%E8%A3%B8%E6%9C%BA%E5%BC%80%E5%8F%91/LV04-02-GPIO-04-C%E8%AF%AD%E8%A8%80%E4%B8%8B%E7%9A%84GPIO%E6%93%8D%E4%BD%9C/img/image-20230719201502966.png">
<meta property="og:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/02IMX6ULL%E5%B9%B3%E5%8F%B0/LV04-%E8%A3%B8%E6%9C%BA%E5%BC%80%E5%8F%91/LV04-02-GPIO-04-C%E8%AF%AD%E8%A8%80%E4%B8%8B%E7%9A%84GPIO%E6%93%8D%E4%BD%9C/img/image-20230719201608630.png">
<meta property="article:published_time" content="2024-11-08T12:59:35.000Z">
<meta property="article:modified_time" content="2025-06-13T16:25:57.038Z">
<meta property="article:author" content="苏木">
<meta property="article:tag" content="(ALPHA)LV04-裸机开发">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/02IMX6ULL%E5%B9%B3%E5%8F%B0/LV04-%E8%A3%B8%E6%9C%BA%E5%BC%80%E5%8F%91/LV04-02-GPIO-04-C%E8%AF%AD%E8%A8%80%E4%B8%8B%E7%9A%84GPIO%E6%93%8D%E4%BD%9C/img/image-20230716162559972.png">


<link rel="canonical" href="https://sumumm.github.io/post/87e9a534.html">



<script class="next-config" data-name="page" type="application/json">{"sidebar":"","isHome":false,"isPost":true,"lang":"zh-CN","comments":"","permalink":"https://sumumm.github.io/post/87e9a534.html","path":"post/87e9a534.html","title":"LV04-02-GPIO-04-C语言下的GPIO操作"}</script>

<script class="next-config" data-name="calendar" type="application/json">""</script>
<title>LV04-02-GPIO-04-C语言下的GPIO操作 | 苏木</title>
  








    <script src="/js/browser_tools_disable.js"></script>

  <noscript>
    <link rel="stylesheet" href="/css/noscript.css">
  </noscript>
<!-- hexo injector head_end start --><link rel="stylesheet" href="https://unpkg.com/hexo-next-tags-plus@latest/lib/tag_plus.css" media="defer" onload="this.media='all'"><!-- hexo injector head_end end --></head>

<body itemscope itemtype="http://schema.org/WebPage" class="use-motion">
  <div class="headband"></div>

  <main class="main">
    <div class="column">
      <header class="header" itemscope itemtype="http://schema.org/WPHeader"><div class="site-brand-container">
  <div class="site-nav-toggle">
    <div class="toggle" aria-label="切换导航栏" role="button">
        <span class="toggle-line"></span>
        <span class="toggle-line"></span>
        <span class="toggle-line"></span>
    </div>
  </div>

  <div class="site-meta">

    <a href="/" class="brand" rel="start">
      <i class="logo-line"></i>
      <p class="site-title">苏木</p>
      <i class="logo-line"></i>
    </a>
      <p class="site-subtitle" itemprop="description">我的学习之路</p>
  </div>

  <div class="site-nav-right">
    <div class="toggle popup-trigger" aria-label="搜索" role="button">
        <i class="fa fa-search fa-fw fa-lg"></i>
    </div>
  </div>
</div>



<nav class="site-nav">
  <ul class="main-menu menu"><li class="menu-item menu-item-home"><a href="/" rel="section"><i class="fa fa-home fa-fw"></i>苏木的家</a></li><li class="menu-item menu-item-categories"><a href="/categories/" rel="section"><i class="fa fa-th fa-fw"></i>分类页<span class="badge">42</span></a></li><li class="menu-item menu-item-archives"><a href="/archives/" rel="section"><i class="fa fa-archive fa-fw"></i>归档页<span class="badge">673</span></a></li><li class="menu-item menu-item-flink"><a href="/flink/" rel="section"><i class="fa fa-link fa-fw"></i>友人帐</a></li><li class="menu-item menu-item-about"><a href="/about/" rel="section"><i class="fa fa-user fa-fw"></i>关于我</a></li>
      <li class="menu-item menu-item-search">
        <a role="button" class="popup-trigger"><i class="fa fa-search fa-fw"></i>搜索
        </a>
      </li>
  </ul>
</nav>



  <div class="search-pop-overlay">
    <div class="popup search-popup"><div class="search-header">
  <span class="search-icon">
    <i class="fa fa-search"></i>
  </span>
  <div class="search-input-container">
    <input autocomplete="off" autocapitalize="off" maxlength="80"
           placeholder="搜索..." spellcheck="false"
           type="search" class="search-input">
  </div>
  <span class="popup-btn-close" role="button">
    <i class="fa fa-times-circle"></i>
  </span>
</div>
<div class="search-result-container no-result">
  <div class="search-result-icon">
    <i class="fa fa-spinner fa-pulse fa-5x"></i>
  </div>
</div>

    </div>
  </div>

</header>
        
  
  <aside class="sidebar">

    <div class="sidebar-inner sidebar-nav-active sidebar-toc-active">
      <ul class="sidebar-nav">
        <li class="sidebar-nav-toc">
          文章目录
        </li>
        <li class="sidebar-nav-overview">
          站点概览
        </li>
      </ul>

      <div class="sidebar-panel-container">
        <!--noindex-->
        <div class="post-toc-wrap sidebar-panel">
            <div class="post-toc animated"><ol class="nav"><li class="nav-item nav-level-1"><a class="nav-link" href="#%E4%B8%80%E3%80%81%E6%A6%82%E8%BF%B0"><span class="nav-text">一、概述</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E4%BA%8C%E3%80%81%E5%90%AF%E5%8A%A8%E6%96%87%E4%BB%B6"><span class="nav-text">二、启动文件</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#1-start-S"><span class="nav-text">1. start.S</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#2-%E6%B1%87%E7%BC%96%E5%88%86%E6%9E%90"><span class="nav-text">2. 汇编分析</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E4%B8%89%E3%80%81C%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F"><span class="nav-text">三、C语言程序</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#1-%E5%AE%9E%E7%8E%B0%E6%AD%A5%E9%AA%A4"><span class="nav-text">1. 实现步骤</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#1-1-%E4%BD%BF%E8%83%BD%E6%97%B6%E9%92%9F"><span class="nav-text">1.1 使能时钟</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#1-2-%E9%80%89%E6%8B%A9GPIO%E5%8A%9F%E8%83%BD"><span class="nav-text">1.2 选择GPIO功能</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#1-3-%E9%85%8D%E7%BD%AEGPIO%E5%8F%82%E6%95%B0"><span class="nav-text">1.3 配置GPIO参数</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#1-4-%E8%AE%BE%E7%BD%AEGPIO%E5%BC%95%E8%84%9A%E6%A8%A1%E5%BC%8F%E5%92%8C%E7%94%B5%E5%B9%B3"><span class="nav-text">1.4 设置GPIO引脚模式和电平</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#2-%E5%AE%8C%E6%95%B4%E4%BB%A3%E7%A0%81"><span class="nav-text">2. 完整代码</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#2-1-main-h"><span class="nav-text">2.1 main.h</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#2-2-main-c"><span class="nav-text">2.2 main.c</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#3-%E9%93%BE%E6%8E%A5%E6%96%87%E4%BB%B6imx6ul-lds"><span class="nav-text">3. 链接文件imx6ul.lds</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#3-1-%E9%93%BE%E6%8E%A5%E8%84%9A%E6%9C%AC%E6%BC%94%E7%A4%BA"><span class="nav-text">3.1 链接脚本演示</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#3-2-imx6ul-lds"><span class="nav-text">3.2 imx6ul.lds</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#4-Makefile"><span class="nav-text">4. Makefile</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E5%9B%9B%E3%80%81%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C"><span class="nav-text">四、编译运行</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#1-%E7%BC%96%E8%AF%91%E7%A8%8B%E5%BA%8F"><span class="nav-text">1. 编译程序</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#2-%E7%83%A7%E5%86%99%E7%A8%8B%E5%BA%8F"><span class="nav-text">2. 烧写程序</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#3-%E5%AE%9E%E9%AA%8C%E7%8E%B0%E8%B1%A1"><span class="nav-text">3. 实验现象</span></a></li></ol></li></ol></div>
        </div>
        <!--/noindex-->

        <div class="site-overview-wrap sidebar-panel">
          <div class="site-author animated" itemprop="author" itemscope itemtype="http://schema.org/Person">
    <img class="site-author-image" itemprop="image" alt="苏木"
      src="/images/avatar.jpg">
  <p class="site-author-name" itemprop="name">苏木</p>
  <div class="site-description" itemprop="description">莫道桑榆晚，为霞尚满天</div>
</div>
<div class="site-state-wrap animated">
  <nav class="site-state">
      <div class="site-state-item site-state-posts">
        <a href="/archives/">
          <span class="site-state-item-count">673</span>
          <span class="site-state-item-name">日志</span>
        </a>
      </div>
      <div class="site-state-item site-state-categories">
          <a href="/categories/">
        <span class="site-state-item-count">42</span>
        <span class="site-state-item-name">分类</span></a>
      </div>
      <div class="site-state-item site-state-tags">
        <span class="site-state-item-count">43</span>
        <span class="site-state-item-name">标签</span>
      </div>
  </nav>
</div>
  <div class="links-of-author animated">
      <span class="links-of-author-item">
        <a href="https://github.com/sumumm" title="GitHub → https:&#x2F;&#x2F;github.com&#x2F;sumumm" rel="noopener me" target="_blank"><i class="fab fa-github fa-fw"></i>GitHub</a>
      </span>
  </div>

        </div>
      </div>
    </div>

    
  </aside>


    </div>

    <div class="main-inner post posts-expand">


  


<div class="post-block">
  
  

  <article itemscope itemtype="http://schema.org/Article" class="post-content" lang="zh-CN">
    <link itemprop="mainEntityOfPage" href="https://sumumm.github.io/post/87e9a534.html">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/images/avatar.jpg">
      <meta itemprop="name" content="苏木">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="苏木">
      <meta itemprop="description" content="莫道桑榆晚，为霞尚满天">
    </span>

    <span hidden itemprop="post" itemscope itemtype="http://schema.org/CreativeWork">
      <meta itemprop="name" content="LV04-02-GPIO-04-C语言下的GPIO操作 | 苏木">
      <meta itemprop="description" content="">
    </span>
      <header class="post-header">
        <h1 class="post-title" itemprop="name headline">
          LV04-02-GPIO-04-C语言下的GPIO操作
        </h1>

        <div class="post-meta-container">
          <div class="post-meta">
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-calendar"></i>
      </span>
      <span class="post-meta-item-text">发表于</span>

      <time title="创建时间：2024-11-08 20:59:35" itemprop="dateCreated datePublished" datetime="2024-11-08T20:59:35+08:00">2024-11-08</time>
    </span>
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-folder"></i>
      </span>
      <span class="post-meta-item-text">分类于</span>
        <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
          <a href="/categories/%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/" itemprop="url" rel="index"><span itemprop="name">嵌入式开发</span></a>
        </span>
          ，
        <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
          <a href="/categories/%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/02IMX6ULL%E5%B9%B3%E5%8F%B0/" itemprop="url" rel="index"><span itemprop="name">02IMX6ULL平台</span></a>
        </span>
          ，
        <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
          <a href="/categories/%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/02IMX6ULL%E5%B9%B3%E5%8F%B0/LV04-%E8%A3%B8%E6%9C%BA%E5%BC%80%E5%8F%91/" itemprop="url" rel="index"><span itemprop="name">LV04-裸机开发</span></a>
        </span>
    </span>

  
    <span class="post-meta-break"></span>
    <span class="post-meta-item" title="本文字数">
      <span class="post-meta-item-icon">
        <i class="far fa-file-word"></i>
      </span>
      <span class="post-meta-item-text">本文字数：</span>
      <span>5k</span>
    </span>
    <span class="post-meta-item" title="阅读时长">
      <span class="post-meta-item-icon">
        <i class="far fa-clock"></i>
      </span>
      <span class="post-meta-item-text">阅读时长 &asymp;</span>
      <span>18 分钟</span>
    </span>
</div>

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody"><p>本文主要是C语言版的LED点亮实验的相关笔记，若笔记中有错误或者不合适的地方，欢迎批评指正😃。</p>
<span id="more"></span>

<!-- Photo: https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/02IMX6ULL%E5%B9%B3%E5%8F%B0/LV04-%E8%A3%B8%E6%9C%BA%E5%BC%80%E5%8F%91/LV04-02-GPIO-04-C%E8%AF%AD%E8%A8%80%E4%B8%8B%E7%9A%84GPIO%E6%93%8D%E4%BD%9C/img/ -->

<details class="folding-tag" blue><summary> 点击查看使用工具及版本 </summary>
              <div class='content'>
              <table>    <tr>        <td align="center" width=150px>Windows版本</td>        <td align="left">windows11</td>    </tr>    <tr>        <td align="center">Ubuntu版本</td>        <td align="left">Ubuntu16.04的64位版本</td>      </tr>    <tr>        <td align="center">VMware® Workstation 16 Pro</td>        <td align="left">16.2.3 build-19376536</td>      </tr>    <tr>        <td align="center">终端软件</td>        <td align="left">MobaXterm(Professional Edition v23.0 Build 5042 (license))</td>      </tr>    <tr>        <td align="center">Linux开发板</td>        <td align="left">正点原子 i.MX6ULL Linux 阿尔法开发板</td>      </tr>    <tr>        <td align="center">uboot</td>        <td align="left">NXP官方提供的uboot，NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03)</td>      </tr>    <tr>        <td align="center">linux内核</td>        <td align="left">linux-4.15(NXP官方提供)</td>      </tr>    <tr>        <td align="center">Win32DiskImager</td>        <td align="left">Win32DiskImager v1.0</td>      </tr></table>
              </div>
            </details>

<details class="folding-tag" blue><summary> 点击查看本文参考资料 </summary>
              <div class='content'>
              <table>    <tr>        <td align="center">分类</td>        <td align="center">网址</td>        <td align="center">说明</td>    </tr>    <tr>        <td align="center" rowspan="5">官方网站</td>        <td align="left"><a href="https://www.arm.com/" target="_blank">https://www.arm.com/</a></td>        <td align="left">ARM官方网站，在这里我们可以找到Cotex-Mx以及ARMVx的一些文档</td>    </tr>    <tr>        <td align="left"><a href="https://www.nxp.com.cn/" target="_blank">https://www.nxp.com.cn/ </a></td>        <td align="left">NXP官方网站</td>    </tr>    <tr>        <td align="left"><a href="https://www.nxpic.org.cn/" target="_blank">https://www.nxpic.org.cn/</a></td><td align="left">NXP 官方社区</td>    </tr>    <tr>        <td align="left"><a href="https://u-boot.readthedocs.io/en/latest/" target="_blank">https://u-boot.readthedocs.io/en/latest/</a></td><td align="left">u-boot官网</td>    </tr>    <tr>        <td align="left"><a href="https://www.kernel.org/" target="_blank">https://www.kernel.org/</a></td><td align="left">linux内核官网</td>    </tr></table>
              </div>
            </details>

<details class="folding-tag" blue><summary> 点击查看相关文件下载 </summary>
              <div class='content'>
              <table>    <tr>        <td align="center">分类</td>        <td align="center">网址</td>        <td align="center">说明</td>    </tr>    <tr>        <td align="center" rowspan="4">NXP</td>        <td align="left"><a href="https://github.com/nxp-imx" target="_blank">https://github.com/nxp-imx</a></td>        <td align="left">NXP imx开发资源GitHub组织，里边会有u-boot和linux内核的仓库</td>    </tr>    <tr>        <td align="left"><a href="https://elixir.bootlin.com/linux/latest/source" target="_blank">https://elixir.bootlin.com/linux/latest/source</a></td>        <td align="left">在线阅读linux kernel源码</td>    </tr>    <tr>        <td align="left"><a href="https://github.com/nxp-imx/linux-imx/releases/tag/rel_imx_4.1.15_2.1.0_ga" target="_blank">nxp-imx/linux-imx/releases/tag/rel_imx_4.1.15_2.1.0_ga</a></td>        <td align="left">NXP linux内核仓库tags中的rel_imx_4.1.15_2.1.0_ga</td>    </tr>    <tr>        <td align="left"><a href="https://github.com/nxp-imx/uboot-imx/releases/tag/rel_imx_4.1.15_2.1.0_ga" target="_blank">nxp-imx/uboot-imx/releases/tag/rel_imx_4.1.15_2.1.0_ga</a></td>        <td align="left">NXP u-boot仓库tags中的rel_imx_4.1.15_2.1.0_ga</td>    </tr>    <tr>        <td align="center" rowspan="2">I.MX6ULL</td>        <td align="left"><a href="https://www.nxp.com.cn/docs/en/data-sheet/IMX6ULLIEC.pdf" target="_blank">i.MX 6ULL Applications Processors for Industrial Products</a></td>        <td align="left">I.MX6ULL 芯片手册（datasheet，可以在线查看）</td>    </tr>    <tr>        <td align="left"><a href="https://www.nxp.com.cn/webapp/Download?colCode=IMX6ULLRM&lang_cd=zh" target="_blank">i.MX 6ULL Applications ProcessorReference Manual</a></td>        <td align="left">I.MX6ULL 参考手册（下载后才能查看，需要登录NXP官网）</td>    </tr></table>
              </div>
            </details>

<h1 id="一、概述"><a href="#一、概述" class="headerlink" title="一、概述"></a><font size=3>一、概述</font></h1><p>实际工作中是很少用到汇编去写嵌入式驱动的，毕竟汇编太难，而且写出来也不好理解，大部分情况下都是使用 C 语言去编写的。只是在开始部分用汇编来初始化一下 C 语言环境，比如初始化 DDR、设置堆栈指针 SP 等等，当这些工作都做完以后就可以进入 C 语言环境，也就是运行 C 语言代码，一般都是进入 main 函数。所以我们有两部分文件要做：</p>
<ul>
<li><p>（1）汇编文件：汇编文件只是用来完成 C 语言环境搭建。</p>
</li>
<li><p>（2）C 语言文件：C 语言文件就是完成我们的业务层代码的，其实就是我们实际例程要完成的功能。</p>
</li>
</ul>
<p>其实 STM32 也是这样的，只是我们在开发 STM32 的时候没有想到这一点，以 STM32F103 为例，其启动文件 startup_stm32f10x_hd.s 这个汇编文件就是完成 C 语言环境搭建的，当然还有一些其他的处理，比如中断向量表等等。当 startup_stm32f10x_hd.s 把 C 语言环境初始化完成以后就会进入 C 语言环境  </p>
<h1 id="二、启动文件"><a href="#二、启动文件" class="headerlink" title="二、启动文件"></a><font size=3>二、启动文件</font></h1><h2 id="1-start-S"><a href="#1-start-S" class="headerlink" title="1. start.S"></a><font size=3>1. start.S</font></h2><p>最简单的，最简的启动文件内容如下所示：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">.global _start  		/* 全局标号 */</span><br><span class="line"></span><br><span class="line">/* 描述：	_start函数，程序从此函数开始执行，此函数主要功能是设置C运行环境。*/</span><br><span class="line">_start:</span><br><span class="line">	/* 进入SVC模式 */</span><br><span class="line">	mrs r0, cpsr</span><br><span class="line">	bic r0, r0, #0x1f 	/* 将r0寄存器中的低5位清零，也就是cpsr的M0~M4 	*/</span><br><span class="line">	orr r0, r0, #0x13 	/* r0或上0x13,表示使用SVC模式					*/</span><br><span class="line">	msr cpsr, r0		/* 将r0 的数据写入到cpsr_c中 					*/</span><br><span class="line"></span><br><span class="line">	ldr sp, =0X80200000	/* 设置栈指针			 */</span><br><span class="line">	b main				/* 跳转到main函数 		 */</span><br></pre></td></tr></table></figure>

<h2 id="2-汇编分析"><a href="#2-汇编分析" class="headerlink" title="2. 汇编分析"></a><font size=3>2. 汇编分析</font></h2><p>第 1 行：定义了一个全局标号_start。</p>
<p>第 4 行：就是标号_start 开始的地方，相当于是一个_start 函数，这个_start 就是第一行代码。</p>
<p>第 6 ~ 9 行：就是设置处理器进入 SVC 模式，Cortex-A 系列处理器有九个运行模型，这里我们设置处理器运行在 SVC 模式下。处理器模式的设置是通过修改 CPSR(程序状态)寄存器来完成的，其中 CPSR 寄存器的M[4:0]（CPSR 的 bit[4:0]）就是设置处理器运行模式的如果要将处理器设置为 SVC模式，那么 M[4:0]就要等于 0X13。第6~9 行代码就是先使用指令 MRS 将 CPSR寄存器的值读取到 R0 中，然后修改 R0 中的值，设置 R0 的 bit[4:0]为 0X13，然后再使用指令MSR 将修改后的 R0 重新写入到 CPSR 中。</p>
<p>第 11 行：通过 ldr 指令设置 SVC 模式下的 SP 指针&#x3D;0X80200000，因为 I.MX6U-ALPHA 开发板上的 DDR3 地址范围是0X80000000 ~ 0XA0000000 （512MB）或 者0X80000000 ~ 0X90000000 （256MB），不管是 512MB 版本还是 256MB 版本的，其 DDR3 起始地址都是 0X80000000。由于Cortex-A7 的堆栈是向下增长的，所以将 SP 指针设置为 0X80200000，因此 SVC 模式的栈大小 0X80200000 - 0X80000000 &#x3D; 0X200000 &#x3D; 2MB，2MB 的栈空间已经很大了，如果做裸机开发的话绰绰有余。</p>
<p>第 12 行：就是跳转到 main 函数， main 函数就是 C 语言代码了。  </p>
<p>以上就是汇编部分程序执行完成，就几行代码，用来设置处理器运行到 SVC 模式下、然后初始化 SP 指针、最终跳转到 C 文件的 main 函数中。其他的芯片，如三星的 S3C2440 或者 S5PV210 ，这一些芯片在使用 SDRAM 或者 DDR 之前必须先初始化 SDRAM 或者 DDR。所以 S3C2440或者 S5PV210 的汇编文件里面是一定会有 SDRAM 或者 DDR 初始化代码的。</p>
<p>但是我们上面编写的 start.s 文件中却没有初始化 DDR3 的代码，但是却将 SVC 模式下的 SP 指针设置到了 DDR3 的地址范围中，这不会出问题吗？肯定不会的， DDR3 肯定是要初始化的，但是不需要在 start.s 文件中完成。在前边学习 DCD 数据的时候就已经讲过了， DCD 数据包含了 DDR 配置参数， I.MX6U 内部的 Boot ROM 会读取 DCD 数据中的 DDR 配置参数然后完成 DDR 初始化的 。</p>
<h1 id="三、C语言程序"><a href="#三、C语言程序" class="headerlink" title="三、C语言程序"></a><font size=3>三、C语言程序</font></h1><h2 id="1-实现步骤"><a href="#1-实现步骤" class="headerlink" title="1. 实现步骤"></a><font size=3>1. 实现步骤</font></h2><p>正点原子的ALPHA开发板的LED灯接在GPIO1_03上边。</p>
<h3 id="1-1-使能时钟"><a href="#1-1-使能时钟" class="headerlink" title="1.1 使能时钟"></a><font size=3>1.1 使能时钟</font></h3><p>我们看一下《i.MX 6ULL Applications Processor Reference Manual》的18.4 System Clocks一节的Table 18-3. System Clocks, Gating, and Override，我们直接搜索GPIO1_CLK关键词就可以找到GPIO1的时钟是CCGR1来控制的。</p>
<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/02IMX6ULL%E5%B9%B3%E5%8F%B0/LV04-%E8%A3%B8%E6%9C%BA%E5%BC%80%E5%8F%91/LV04-02-GPIO-04-C%E8%AF%AD%E8%A8%80%E4%B8%8B%E7%9A%84GPIO%E6%93%8D%E4%BD%9C/img/image-20230716162559972.png" alt="image-20230716162559972" style="zoom:50%;" />

<p>然后查看一下，CCGR1的哪一位是用于配置gpio1的：</p>
<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/02IMX6ULL%E5%B9%B3%E5%8F%B0/LV04-%E8%A3%B8%E6%9C%BA%E5%BC%80%E5%8F%91/LV04-02-GPIO-04-C%E8%AF%AD%E8%A8%80%E4%B8%8B%E7%9A%84GPIO%E6%93%8D%E4%BD%9C/img/image-20230719195210025.png" alt="image-20230719195210025" style="zoom:50%;" />

<p>可以看到是CG13[27:26]这两位来控制的，它们有四种情况，都代表什么含义？我们可以看一下参考手册的 18.6.23 CCM Clock Gating Register 0 (CCM_CCGR0) 也就是这些寄存器最开始的时候，对于值是有说明的：</p>
<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/02IMX6ULL%E5%B9%B3%E5%8F%B0/LV04-%E8%A3%B8%E6%9C%BA%E5%BC%80%E5%8F%91/LV04-02-GPIO-04-C%E8%AF%AD%E8%A8%80%E4%B8%8B%E7%9A%84GPIO%E6%93%8D%E4%BD%9C/img/image-20230719195813566.png" alt="image-20230719195813566" style="zoom:50%;" />

<p>由此可知，对于GPIO时钟控制位来说，有如下四种情况：</p>
<p>（1）00：该 GPIO 模块全程被关闭</p>
<p>（2）01：该 GPIO 模块在 CPU run mode 情况下是使能的；在 WAIT 或 STOP 模式下，关闭</p>
<p>（3）10：保留</p>
<p>（4）11：该 GPIO 模块全程使能  </p>
<h3 id="1-2-选择GPIO功能"><a href="#1-2-选择GPIO功能" class="headerlink" title="1.2 选择GPIO功能"></a><font size=3>1.2 选择GPIO功能</font></h3><p>我们找到《i.MX 6ULL Applications Processor Reference Manual》参考手册的 32.6.10 SW_MUX_CTL_PAD_GPIO1_IO03 SW MUX Control Register (IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03) 一节：</p>
<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/02IMX6ULL%E5%B9%B3%E5%8F%B0/LV04-%E8%A3%B8%E6%9C%BA%E5%BC%80%E5%8F%91/LV04-02-GPIO-04-C%E8%AF%AD%E8%A8%80%E4%B8%8B%E7%9A%84GPIO%E6%93%8D%E4%BD%9C/img/image-20230719200601757.png" alt="image-20230719200601757" style="zoom:50%;" />

<h3 id="1-3-配置GPIO参数"><a href="#1-3-配置GPIO参数" class="headerlink" title="1.3 配置GPIO参数"></a><font size=3>1.3 配置GPIO参数</font></h3><p>我们可以找到《i.MX 6ULL Applications Processor Reference Manual》参考手册的32.6.156 SW_PAD_CTL_PAD_GPIO1_IO03 SW PAD Control Register (IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03)：</p>
<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/02IMX6ULL%E5%B9%B3%E5%8F%B0/LV04-%E8%A3%B8%E6%9C%BA%E5%BC%80%E5%8F%91/LV04-02-GPIO-04-C%E8%AF%AD%E8%A8%80%E4%B8%8B%E7%9A%84GPIO%E6%93%8D%E4%BD%9C/img/image-20230719201027343.png" alt="image-20230719201027343" style="zoom:50%;" />

<p>可以知道：</p>
<pre><code> *bit 16     :0 HYS关闭
 *bit [15:14]: 00 默认下拉
 *bit [13]   : 0 kepper功能
 *bit [12]   : 1 pull/keeper使能
 *bit [11]   : 0 关闭开路输出
 *bit [7:6]  : 10 速度100Mhz
 *bit [5:3]  : 110 R0/6驱动能力
 *bit [0]    : 0 低转换率
</code></pre>
<h3 id="1-4-设置GPIO引脚模式和电平"><a href="#1-4-设置GPIO引脚模式和电平" class="headerlink" title="1.4 设置GPIO引脚模式和电平"></a><font size=3>1.4 设置GPIO引脚模式和电平</font></h3><p>我们可以找到《i.MX 6ULL Applications Processor Reference Manual》参考手册的28.5 GPIO Memory Map&#x2F;Register Definition，可以找到如下寄存器：</p>
<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/02IMX6ULL%E5%B9%B3%E5%8F%B0/LV04-%E8%A3%B8%E6%9C%BA%E5%BC%80%E5%8F%91/LV04-02-GPIO-04-C%E8%AF%AD%E8%A8%80%E4%B8%8B%E7%9A%84GPIO%E6%93%8D%E4%BD%9C/img/image-20230719201349250.png" alt="image-20230719201349250" style="zoom:50%;" />

<ul>
<li>设置方向寄存器，把引脚设置为输出引脚：</li>
</ul>
<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/02IMX6ULL%E5%B9%B3%E5%8F%B0/LV04-%E8%A3%B8%E6%9C%BA%E5%BC%80%E5%8F%91/LV04-02-GPIO-04-C%E8%AF%AD%E8%A8%80%E4%B8%8B%E7%9A%84GPIO%E6%93%8D%E4%BD%9C/img/image-20230719201427614.png" alt="image-20230719201427614" style="zoom:50%;" />

<ul>
<li>设置数据寄存器，设置引脚的输出电平：</li>
</ul>
<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/02IMX6ULL%E5%B9%B3%E5%8F%B0/LV04-%E8%A3%B8%E6%9C%BA%E5%BC%80%E5%8F%91/LV04-02-GPIO-04-C%E8%AF%AD%E8%A8%80%E4%B8%8B%E7%9A%84GPIO%E6%93%8D%E4%BD%9C/img/image-20230719201502966.png" alt="image-20230719201502966" style="zoom:50%;" />



<h2 id="2-完整代码"><a href="#2-完整代码" class="headerlink" title="2. 完整代码"></a><font size=3>2. 完整代码</font></h2><h3 id="2-1-main-h"><a href="#2-1-main-h" class="headerlink" title="2.1 main.h"></a><font size=3>2.1 main.h</font></h3><details class="folding-tag" blue><summary> 点击查看 main.h 详细内容 </summary>
              <div class='content'>
              <figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">ifndef</span> __MAIN_H</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> __MAIN_H</span></span><br><span class="line"><span class="comment">/* CCM相关寄存器地址 */</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CCM_CCGR0 			*((volatile unsigned int *)0X020C4068)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CCM_CCGR1 			*((volatile unsigned int *)0X020C406C)</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CCM_CCGR2 			*((volatile unsigned int *)0X020C4070)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CCM_CCGR3 			*((volatile unsigned int *)0X020C4074)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CCM_CCGR4 			*((volatile unsigned int *)0X020C4078)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CCM_CCGR5 			*((volatile unsigned int *)0X020C407C)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> CCM_CCGR6 			*((volatile unsigned int *)0X020C4080)</span></span><br><span class="line"></span><br><span class="line"><span class="comment">/* IOMUX相关寄存器地址 */</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> SW_MUX_GPIO1_IO03 	*((volatile unsigned int *)0X020E0068)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> SW_PAD_GPIO1_IO03 	*((volatile unsigned int *)0X020E02F4)</span></span><br><span class="line"></span><br><span class="line"><span class="comment">/* GPIO1相关寄存器地址 */</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> GPIO1_DR 			*((volatile unsigned int *)0X0209C000)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> GPIO1_GDIR 			*((volatile unsigned int *)0X0209C004)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> GPIO1_PSR 			*((volatile unsigned int *)0X0209C008)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> GPIO1_ICR1 			*((volatile unsigned int *)0X0209C00C)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> GPIO1_ICR2 			*((volatile unsigned int *)0X0209C010)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> GPIO1_IMR 			*((volatile unsigned int *)0X0209C014)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> GPIO1_ISR 			*((volatile unsigned int *)0X0209C018)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> GPIO1_EDGE_SEL 		*((volatile unsigned int *)0X0209C01C)</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br></pre></td></tr></table></figure>
              </div>
            </details>

<h3 id="2-2-main-c"><a href="#2-2-main-c" class="headerlink" title="2.2 main.c"></a><font size=3>2.2 main.c</font></h3><details class="folding-tag" blue><summary> 点击查看 main.c 文件 </summary>
              <div class='content'>
              <figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;main.h&quot;</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * @description	: 使能I.MX6U所有外设时钟</span></span><br><span class="line"><span class="comment"> * @param 		: 无</span></span><br><span class="line"><span class="comment"> * @return 		: 无</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">clk_enable</span><span class="params">(<span class="type">void</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">	CCM_CCGR0 = <span class="number">0xffffffff</span>;</span><br><span class="line">	CCM_CCGR1 = <span class="number">0xffffffff</span>;</span><br><span class="line">	CCM_CCGR2 = <span class="number">0xffffffff</span>;</span><br><span class="line">	CCM_CCGR3 = <span class="number">0xffffffff</span>;</span><br><span class="line">	CCM_CCGR4 = <span class="number">0xffffffff</span>;</span><br><span class="line">	CCM_CCGR5 = <span class="number">0xffffffff</span>;</span><br><span class="line">	CCM_CCGR6 = <span class="number">0xffffffff</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * @description	: 初始化LED对应的GPIO</span></span><br><span class="line"><span class="comment"> * @param 		: 无</span></span><br><span class="line"><span class="comment"> * @return 		: 无</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">led_init</span><span class="params">(<span class="type">void</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">	<span class="comment">/* 1、初始化IO复用 */</span></span><br><span class="line">	SW_MUX_GPIO1_IO03 = <span class="number">0x5</span>;	<span class="comment">/* 复用为GPIO1_IO03 */</span></span><br><span class="line"></span><br><span class="line">	<span class="comment">/* 2、、配置GPIO1_IO03的IO属性	</span></span><br><span class="line"><span class="comment">	 *bit 16:0 HYS关闭</span></span><br><span class="line"><span class="comment">	 *bit [15:14]: 00 默认下拉</span></span><br><span class="line"><span class="comment">     *bit [13]: 0 kepper功能</span></span><br><span class="line"><span class="comment">     *bit [12]: 1 pull/keeper使能</span></span><br><span class="line"><span class="comment">     *bit [11]: 0 关闭开路输出</span></span><br><span class="line"><span class="comment">     *bit [7:6]: 10 速度100Mhz</span></span><br><span class="line"><span class="comment">     *bit [5:3]: 110 R0/6驱动能力</span></span><br><span class="line"><span class="comment">     *bit [0]: 0 低转换率</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">	SW_PAD_GPIO1_IO03 = <span class="number">0X10B0</span>;		</span><br><span class="line"></span><br><span class="line">	<span class="comment">/* 3、初始化GPIO */</span></span><br><span class="line">	GPIO1_GDIR = <span class="number">0X0000008</span>;	<span class="comment">/* GPIO1_IO03设置为输出 */</span></span><br><span class="line"></span><br><span class="line">	<span class="comment">/* 4、设置GPIO1_IO03输出低电平，打开LED0 */</span></span><br><span class="line">	GPIO1_DR = <span class="number">0X0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * @description	: 打开LED灯</span></span><br><span class="line"><span class="comment"> * @param 		: 无</span></span><br><span class="line"><span class="comment"> * @return 		: 无</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">led_on</span><span class="params">(<span class="type">void</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">	<span class="comment">/* 将GPIO1_DR的bit3清零 */</span></span><br><span class="line">	GPIO1_DR &amp;= ~(<span class="number">1</span>&lt;&lt;<span class="number">3</span>); </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * @description	: 关闭LED灯</span></span><br><span class="line"><span class="comment"> * @param 		: 无</span></span><br><span class="line"><span class="comment"> * @return 		: 无</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">led_off</span><span class="params">(<span class="type">void</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">	<span class="comment">/* 将GPIO1_DR的bit3置1 */</span></span><br><span class="line">	GPIO1_DR |= (<span class="number">1</span>&lt;&lt;<span class="number">3</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * @description	: 短时间延时函数</span></span><br><span class="line"><span class="comment"> * @param - n	: 要延时循环次数(空操作循环次数，模式延时)</span></span><br><span class="line"><span class="comment"> * @return 		: 无</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">delay_short</span><span class="params">(<span class="keyword">volatile</span> <span class="type">unsigned</span> <span class="type">int</span> n)</span></span><br><span class="line">&#123;</span><br><span class="line">	<span class="keyword">while</span>(n--)&#123;&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * @description	: 延时函数,在396Mhz的主频下</span></span><br><span class="line"><span class="comment"> * 			  	  延时时间大约为1ms</span></span><br><span class="line"><span class="comment"> * @param - n	: 要延时的ms数</span></span><br><span class="line"><span class="comment"> * @return 		: 无</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">delay</span><span class="params">(<span class="keyword">volatile</span> <span class="type">unsigned</span> <span class="type">int</span> n)</span></span><br><span class="line">&#123;</span><br><span class="line">	<span class="keyword">while</span>(n--)</span><br><span class="line">	&#123;</span><br><span class="line">		delay_short(<span class="number">0x7ff</span>);</span><br><span class="line">	&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">(<span class="type">void</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">	clk_enable();		<span class="comment">/* 使能所有的时钟		 	*/</span></span><br><span class="line">	led_init();			<span class="comment">/* 初始化led 			*/</span></span><br><span class="line"></span><br><span class="line">	<span class="keyword">while</span>(<span class="number">1</span>)			<span class="comment">/* 死循环 				*/</span></span><br><span class="line">	&#123;	</span><br><span class="line">		led_off();		<span class="comment">/* 关闭LED   			*/</span></span><br><span class="line">		delay(<span class="number">500</span>);		<span class="comment">/* 延时大约500ms 		*/</span></span><br><span class="line"></span><br><span class="line">		led_on();		<span class="comment">/* 打开LED		 	*/</span></span><br><span class="line">		delay(<span class="number">500</span>);		<span class="comment">/* 延时大约500ms 		*/</span></span><br><span class="line">	&#125;</span><br><span class="line"></span><br><span class="line">	<span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>main.c 文件里面一共有 7 个函数，这 7 个函数都很简单。 </p><p>clk_enable 函数是使能CCGR0~CCGR6 所控制的所有外设时钟。</p><p> ed_init 函数是初始化 LED 灯所使用的 IO，包括设置IO 的复用功能、 IO 的属性配置和 GPIO 功能，最终控制 GPIO 输出低电平来打开 LED 灯。</p><p>led_on 和 led_off 这两个函数看名字就知道，用来控制 LED 灯的亮灭的。 </p><p>delay_short()和 delay()这两个函数是延时函数， delay_short()函数是靠空循环来实现延时的， delay()是对 delay_short()的简单封装，在 I.MX6U 工作 在 396MHz(Boot ROM 设 置的 396MHz)的主频的时候delay_short(0x7ff)基本能够实现大约 1ms 的延时，所以 delay()函数我们可以用来完成 ms 延时。  </p><p>main 函数就是我们的主函数了，在 main 函数中先调用函数 clk_enable()和 led_init()来完成时钟使能和 LED 初始化，最终在 while(1)循环中实现 LED 循环亮灭，亮灭时间大约是 500ms。  </p>
              </div>
            </details>

<h2 id="3-链接文件imx6ul-lds"><a href="#3-链接文件imx6ul-lds" class="headerlink" title="3. 链接文件imx6ul.lds"></a><font size=3>3. 链接文件imx6ul.lds</font></h2><h3 id="3-1-链接脚本演示"><a href="#3-1-链接脚本演示" class="headerlink" title="3.1 链接脚本演示"></a><font size=3>3.1 链接脚本演示</font></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">SECTIONS&#123;</span><br><span class="line">    . = 0X10000000;</span><br><span class="line">    .text : &#123;*(.text)&#125;</span><br><span class="line">    . = 0X30000000;</span><br><span class="line">    .data ALIGN(4) : &#123; *(.data) &#125;</span><br><span class="line">    .bss ALIGN(4) : &#123; *(.bss) &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<p>第 1 行：我们先写了一个关键字“SECTIONS”，后面跟了一个大括号，这个大括号和第 7 行的大括号是一对，这是必须的。看起来就跟 C 语言里面的函数一样。</p>
<p>第 2 行：对一个特殊符号“.”进行赋值，“.”在链接脚本里面叫做定位计数器，默认的定位计数器为 0。我们要求代码链接到以 0X10000000 为起始地址的地方，因此这一行给“.”赋值0X10000000，表示以 0X10000000 开始，后面的文件或者段都会以 0X10000000 为起始地址开始链接。  </p>
<p>第 3 行：“.text”是段名，后面的冒号是语法要求，冒号后面的大括号里面可以填上要链接到“.text”这个段里面的所有文件，“*(.text)”中的“*”是通配符，表示所有输入文件的 .text 段都放到 “.text” 中。  </p>
<p>第 4 行，我们的要求是数据放到 0X30000000 开始的地方，所以我们需要重新设置定位计数器“.”，将其改为 0X30000000。如果不重新设置的话会怎么样？假设“.text”段大小为 0X10000，那么接下来的.data 段开始地址就是 0X10000000+0X10000&#x3D;0X10010000，这明显不符合我们的要求。所以我们必须调整定位计数器为 0X30000000。</p>
<p>第 5 行跟第 3 行一样，定义了一个名为“.data”的段，然后所有文件的“.data”段都放到这里面。但是这一行多了一个“ALIGN(4)”，这是什么意思呢？这是用来对“.data”这个段的起始地址做字节对齐的， ALIGN(4)表示 4 字节对齐。也就是说段“.data”的起始地址要能被 4 整除，一般常见的都是 ALIGN(4)或者 ALIGN(8)，也就是 4 字节或者 8 字节对齐。</p>
<p>第 6 行：定义了一个“.bss”段，所有文件中的“.bss”数据都会被放到这个里面，“.bss”数据就是那些定义了但是没有被初始化的变量。  </p>
<h3 id="3-2-imx6ul-lds"><a href="#3-2-imx6ul-lds" class="headerlink" title="3.2 imx6ul.lds"></a><font size=3>3.2 imx6ul.lds</font></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">SECTIONS&#123;</span><br><span class="line">	. = 0X87800000;</span><br><span class="line">	.text :</span><br><span class="line">	&#123;</span><br><span class="line">		start.o </span><br><span class="line">		main.o </span><br><span class="line">		*(.text)</span><br><span class="line">	&#125;</span><br><span class="line">	.rodata ALIGN(4) : &#123;*(.rodata*)&#125;     </span><br><span class="line">	.data ALIGN(4)   : &#123; *(.data) &#125;    </span><br><span class="line">	__bss_start = .;    </span><br><span class="line">	.bss ALIGN(4)  : &#123; *(.bss)  *(COMMON) &#125;    </span><br><span class="line">	__bss_end = .;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<p>上面的链接脚本文件和前边的演示代码是基本一致的：</p>
<p>第 2 行设置定位计数器为0X87800000，因为我们的链接地址就是0X87800000。</p>
<p>第5行设置链接到开始位置的文件为start.o，因为 start.o 里面包含着第一个要执行的指令，所以一定要链接到最开始的地方。</p>
<p>第 6 行是 main.o这个文件，其实可以不用写出来，因为 main.o 的位置就无所谓了，可以由编译器自行决定链接位置。</p>
<p>第 11、 13 行：有“__bss_start”和“__bss_end”这两个东西？这个是什么呢？“__bss_start”和“__bss_end”是符号，第 11、 13 这两行其实就是对这两个符号进行赋值，其值为定位符 <code>.</code>，这两个符号用来保存 .bss 段的起始地址和结束地址。前面说了.bss 段是定义了但是没有被初始化的变量，我们需要手动对.bss 段的变量清零的，因此我们需要知道.bss 段的起始和结束地址，这样我们直接对这段内存赋 0 即可完成清零。通过第 11、 13 行代码， .bss 段的起始地址和结束地址就保存在了“__bss_start”和“__bss_end”中，我们就可以直接在汇编或者 C 文件里面使用这两个符号。</p>
<h2 id="4-Makefile"><a href="#4-Makefile" class="headerlink" title="4. Makefile"></a><font size=3>4. Makefile</font></h2><details class="folding-tag" blue><summary> 点击查看 Makefile 文件 </summary>
              <div class='content'>
              <figure class="highlight makefile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">objs := start.o main.o</span><br><span class="line"></span><br><span class="line"><span class="section">ledc.bin:<span class="variable">$(objs)</span></span></span><br><span class="line">	arm-linux-gnueabihf-ld -Timx6ul.lds -o ledc.elf <span class="variable">$^</span></span><br><span class="line">	arm-linux-gnueabihf-objcopy -O binary -S ledc.elf <span class="variable">$@</span></span><br><span class="line">	arm-linux-gnueabihf-objdump -D -m arm ledc.elf &gt; ledc.dis</span><br><span class="line">	</span><br><span class="line"><span class="section">%.o:%.s</span></span><br><span class="line">	arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o <span class="variable">$@</span> <span class="variable">$&lt;</span></span><br><span class="line">	</span><br><span class="line"><span class="section">%.o:%.S</span></span><br><span class="line">	arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o <span class="variable">$@</span> <span class="variable">$&lt;</span></span><br><span class="line">	</span><br><span class="line"><span class="section">%.o:%.c</span></span><br><span class="line">	arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o <span class="variable">$@</span> <span class="variable">$&lt;</span></span><br><span class="line">	</span><br><span class="line"><span class="section">clean:</span></span><br><span class="line">	rm -rf *.o ledc.bin ledc.elf ledc.dis</span><br></pre></td></tr></table></figure>
              </div>
            </details>

<h1 id="四、编译运行"><a href="#四、编译运行" class="headerlink" title="四、编译运行"></a><font size=3>四、编译运行</font></h1><h2 id="1-编译程序"><a href="#1-编译程序" class="headerlink" title="1. 编译程序"></a><font size=3>1. 编译程序</font></h2><p>我们直接执行make命令，就会得到我们所需要的所有文件：</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">make</span><br></pre></td></tr></table></figure>

<img data-src="https://fanhua-picture.oss-cn-hangzhou.aliyuncs.com/01%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BC%80%E5%8F%91/02IMX6ULL%E5%B9%B3%E5%8F%B0/LV04-%E8%A3%B8%E6%9C%BA%E5%BC%80%E5%8F%91/LV04-02-GPIO-04-C%E8%AF%AD%E8%A8%80%E4%B8%8B%E7%9A%84GPIO%E6%93%8D%E4%BD%9C/img/image-20230719201608630.png" alt="image-20230719201608630" style="zoom:50%;" />

<h2 id="2-烧写程序"><a href="#2-烧写程序" class="headerlink" title="2. 烧写程序"></a><font size=3>2. 烧写程序</font></h2><p>我们采用之前正点原子所提供的工具来在ubuntu下烧写到sd卡即可，感觉还是比较方便得。</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">chmod 777 imxdownload           # 给予 imxdownload 可执行权限，一次即可</span><br><span class="line">./imxdownload ledc.bin /dev/sdc # 烧写到 SD 卡中，不能烧写到/dev/sda 或 sda1 设备里面</span><br></pre></td></tr></table></figure>

<h2 id="3-实验现象"><a href="#3-实验现象" class="headerlink" title="3. 实验现象"></a><font size=3>3. 实验现象</font></h2><p>烧写成功以后将 SD 卡插到开发板的 SD 卡槽中，然后复位开发板，如果代码运行正常的话 LED0 就会以 500ms 的时间间隔亮灭。  </p>

    </div>

    
    
    

    <footer class="post-footer">




    <div>
        
            <div style="text-align:center;color: #ccc;font-size:14px;">
            ----------本文结束
            <i class="fas fa-fan fa-spin" style="color: #FF1493; font-size: 1rem"></i>
            感谢您的阅读----------
            </div>
        
    </div>





  
  <div class="my_post_copyright"> 
    <p><span>文章标题:</span><a href="/post/87e9a534.html">LV04-02-GPIO-04-C语言下的GPIO操作</a></p>
    <p><span>文章作者:</span><a href="/" title="欢迎访问 《苏木》 的学习笔记">苏木</a></p>
    <p><span>发布时间:</span>2024年11月08日 - 20:59</p>
    <p><span>最后更新:</span>2025年06月14日 - 00:25</p>
    <p><span>原始链接:</span><a href="/post/87e9a534.html" title="LV04-02-GPIO-04-C语言下的GPIO操作">https://sumumm.github.io/post/87e9a534.html</a></p>
    <p><span>许可协议:</span><i class="fab fa-creative-commons"></i> <a rel="license" href= "https://creativecommons.org/licenses/by-nc-nd/4.0/" target="_blank" title="Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0)">署名-非商业性使用-禁止演绎 4.0 国际</a> 转载请保留原文链接及作者。</p>  
  </div>
  


          <div class="post-tags">
              <a href="/tags/ALPHA-LV04-%E8%A3%B8%E6%9C%BA%E5%BC%80%E5%8F%91/" rel="tag"><i class="fa fa-tag"></i> (ALPHA)LV04-裸机开发</a>
          </div>

        

          <div class="post-nav">
            <div class="post-nav-item">
                <a href="/post/efc7a624.html" rel="prev" title="LV04-02-GPIO-05-根据dis文件分析代码运行">
                  <i class="fa fa-angle-left"></i> LV04-02-GPIO-05-根据dis文件分析代码运行
                </a>
            </div>
            <div class="post-nav-item">
                <a href="/post/8cf1af4a.html" rel="next" title="LV04-02-GPIO-03-裸机程序烧写">
                  LV04-02-GPIO-03-裸机程序烧写 <i class="fa fa-angle-right"></i>
                </a>
            </div>
          </div>
    </footer>
  </article>
</div>






</div>
  </main>

  <footer class="footer">
    <div class="footer-inner">

  <div class="copyright">
    &copy; 2017 – 
    <span itemprop="copyrightYear">2025</span>
    <span class="with-love">
      <i class="fa fa-heart"></i>
    </span>
    <span class="author" itemprop="copyrightHolder">苏木</span>
  </div>
<div class="wordcount">
  <span class="post-meta-item">
    <span class="post-meta-item-icon">
      <i class="fa fa-chart-line"></i>
    </span>
      <span>站点总字数：</span>
    <span title="站点总字数">3.7m</span>
  </span>
  <span class="post-meta-item">
    <span class="post-meta-item-icon">
      <i class="fa fa-coffee"></i>
    </span>
      <span>站点阅读时长 &asymp;</span>
    <span title="站点阅读时长">225:26</span>
  </span>
</div>




    <span id="sitetime"></span>
    <script defer language=javascript>
        function siteTime()
        {
            window.setTimeout("siteTime()", 1000);
            var seconds = 1000;
            var minutes = seconds * 60;
            var hours = minutes * 60;
            var days = hours * 24;
            var years = days * 365;
            var today = new Date();
            var todayYear = today.getFullYear();
            var todayMonth = today.getMonth()+1;
            var todayDate = today.getDate();
            var todayHour = today.getHours();
            var todayMinute = today.getMinutes();
            var todaySecond = today.getSeconds();
            /*==================================================
            Date.UTC() -- 返回date对象距世界标准时间(UTC)1970年1月1日午夜之间的毫秒数(时间戳)
            year        - 作为date对象的年份，为4位年份值
            month       - 0-11之间的整数，做为date对象的月份
            day         - 1-31之间的整数，做为date对象的天数
            hours       - 0(午夜24点)-23之间的整数，做为date对象的小时数
            minutes     - 0-59之间的整数，做为date对象的分钟数
            seconds     - 0-59之间的整数，做为date对象的秒数
            microseconds - 0-999之间的整数，做为date对象的毫秒数
            ==================================================*/
            var t1 = Date.UTC(2017, 
                              5, 
                              19, 
                              0, 
                              0, 
                              0); //北京时间
            var t2 = Date.UTC(todayYear,todayMonth,todayDate,todayHour,todayMinute,todaySecond);
            var diff = t2-t1;
            var diffYears = Math.floor(diff/years);
            var diffDays = Math.floor((diff/days)-diffYears*365);
            var diffHours = Math.floor((diff-(diffYears*365+diffDays)*days)/hours);
            var diffMinutes = Math.floor((diff-(diffYears*365+diffDays)*days-diffHours*hours)/minutes);
            var diffSeconds = Math.floor((diff-(diffYears*365+diffDays)*days-diffHours*hours-diffMinutes*minutes)/seconds);
            document.getElementById("sitetime").innerHTML="已在这里 "+diffYears+" 年 "+diffDays+" 天 "+diffHours+" 小时 "+diffMinutes+" 分钟 "+diffSeconds+" 秒";
        }
        siteTime();
    </script>



    </div>
  </footer>

  
  <div class="back-to-top" role="button" aria-label="返回顶部">
    <i class="fa fa-arrow-up fa-lg"></i>
    <span>0%</span>
  </div>
  <div class="reading-progress-bar"></div>

<noscript>
  <div class="noscript-warning">Theme NexT works best with JavaScript enabled</div>
</noscript>


  
  <script src="https://cdnjs.cloudflare.com/ajax/libs/animejs/3.2.1/anime.min.js" integrity="sha256-XL2inqUJaslATFnHdJOi9GfQ60on8Wx1C2H8DYiN1xY=" crossorigin="anonymous"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/next-theme-pjax/0.6.0/pjax.min.js" integrity="sha256-vxLn1tSKWD4dqbMRyv940UYw4sXgMtYcK6reefzZrao=" crossorigin="anonymous"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/fancyapps-ui/5.0.28/fancybox/fancybox.umd.js" integrity="sha256-ytMJGN3toR+a84u7g7NuHm91VIR06Q41kMWDr2pq7Zo=" crossorigin="anonymous"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/lozad.js/1.16.0/lozad.min.js" integrity="sha256-mOFREFhqmHeQbXpK2lp4nA3qooVgACfh88fpJftLBbc=" crossorigin="anonymous"></script>
<script src="/js/comments.js"></script><script src="/js/utils.js"></script><script src="/js/motion.js"></script><script src="/js/next-boot.js"></script><script src="/js/pjax.js"></script>

  <script src="https://cdnjs.cloudflare.com/ajax/libs/hexo-generator-searchdb/1.4.1/search.js" integrity="sha256-1kfA5uHPf65M5cphT2dvymhkuyHPQp5A53EGZOnOLmc=" crossorigin="anonymous"></script>
<script src="/js/third-party/search/local-search.js"></script>




  <script src="/js/third-party/fancybox.js"></script>

  <script src="/js/third-party/pace.js"></script>


  




  

  <script class="next-config" data-name="enableMath" type="application/json">true</script><script class="next-config" data-name="mathjax" type="application/json">{"enable":true,"tags":"none","js":{"url":"https://cdnjs.cloudflare.com/ajax/libs/mathjax/3.2.2/es5/tex-mml-chtml.js","integrity":"sha256-MASABpB4tYktI2Oitl4t+78w/lyA+D7b/s9GEP0JOGI="}}</script>
<script src="/js/third-party/math/mathjax.js"></script>


 
        <div id="click-show-text"
            data-mobile = false
            data-text = 富强,民主,文明,和谐,自由,平等,公正,法制,爱国,敬业,诚信,友善
            data-fontsize = 15px
            data-random= false>
        </div>
       

      
        <script async src=https://cdn.jsdelivr.net/npm/hexo-next-mouse-effect@latest/click/showText.js></script>
      

      
    




    <script async src="/js/fancybox_param.js"></script>





<!-- APlayer本体 -->



</body>
</html>
